﻿// See https://aka.ms/new-console-template for more information

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

public class ImageProcessor
{
    /// <summary>
    /// 将图片中纯白（255,255,255）的像素透明化并保存
    /// </summary>
    /// <param name="inputPath">输入图片路径</param>
    /// <param name="outputPath">输出图片路径（建议使用 .png 格式）</param>
    public static void MakeWhiteTransparent(string inputPath, string outputPath)
    {
        // 加载原始图片
        using (Bitmap originalImage = new Bitmap(inputPath))
        {
            // 确保图片支持 Alpha 通道（32位 ARGB）
            Bitmap processedImage = ConvertToArgbFormat(originalImage);

            // 锁定像素数据（直接操作内存）
            Rectangle rect = new Rectangle(0, 0, processedImage.Width, processedImage.Height);
            BitmapData bmpData = processedImage.LockBits(rect, ImageLockMode.ReadWrite, processedImage.PixelFormat);

            try
            {
                // 获取像素数据的字节数组指针
                IntPtr ptr = bmpData.Scan0;
                int bytes = Math.Abs(bmpData.Stride) * processedImage.Height; // 总字节数
                byte[] pixelBytes = new byte[bytes];

                // 将内存中的像素数据复制到字节数组
                System.Runtime.InteropServices.Marshal.Copy(ptr, pixelBytes, 0, bytes);

                // 遍历每个像素（按行处理）
                for (int y = 0; y < processedImage.Height; y++)
                {
                    for (int x = 0; x < processedImage.Width; x++)
                    {
                        // 计算当前像素在数组中的索引（32位 ARGB 格式：每个像素占4字节）
                        int index = (y * bmpData.Stride) + (x * 4);

                        // 提取 R、G、B 分量（注意：BGR 顺序，非 RGB）
                        byte blue = pixelBytes[index];
                        byte green = pixelBytes[index + 1];
                        byte red = pixelBytes[index + 2];

                        // 判断是否为纯白（255,255,255）
                        if (red == 255 && green == 255 && blue == 255)
                        {
                            // 设置 Alpha 为 0（完全透明）
                            pixelBytes[index + 3] = 0;
                        }
                    }
                }

                // 将修改后的字节数组复制回内存
                System.Runtime.InteropServices.Marshal.Copy(pixelBytes, 0, ptr, bytes);
            }
            finally
            {
                // 解锁像素数据
                processedImage.UnlockBits(bmpData);
            }

            // 保存处理后的图片（使用 PNG 格式保留透明度）
            processedImage.Save(outputPath, ImageFormat.Png);
        }
    }

    /// <summary>
    /// 将图片转换为 32位 ARGB 格式（支持透明度）
    /// </summary>
    private static Bitmap ConvertToArgbFormat(Bitmap image)
    {
        // 若原图已支持 ARGB，直接返回
        if (image.PixelFormat == PixelFormat.Format32bppArgb)
            return new Bitmap(image);

        // 否则转换为 32位 ARGB 格式
        Bitmap argbImage = new Bitmap(image.Width, image.Height, PixelFormat.Format32bppArgb);
        using (Graphics g = Graphics.FromImage(argbImage))
        {
            g.DrawImage(image, 0, 0); // 绘制原图到新图（自动处理格式转换）
        }
        return argbImage;
    }

    // 示例用法
    public static void Main()
    {
        try
        {
            // 输入图片路径（支持 JPG、PNG 等格式）
            string input = "input.jpg";
            // 输出图片路径（必须使用 PNG 格式以保留透明度）
            string output = "output.png";

            MakeWhiteTransparent(input, output);
            Console.WriteLine("图片处理完成！");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"处理失败：{ex.Message}");
        }
    }
}
